package ua.at.tsvetkov.net;

import android.annotation.TargetApi;
import android.os.Build;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Collections;
import java.util.List;

import org.apache.http.conn.util.InetAddressUtils;

/**
 * // AndroidManifest.xml permissions
 * <uses-permission android:name="android.permission.INTERNET" />
 * <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 * 
 * // test functions
 * Utils.getMACAddress("wlan0");
 * Utils.getMACAddress("eth0");
 * Utils.getIPAddress(true); // IPv4
 * Utils.getIPAddress(false); // IPv6 
 * 
 * @author Alexandr Tsvetkov
 *
 */
public class NetUtil {

   /**
    * Returns MAC address of the given interface name.
    * @param interfaceName eth0, wlan0 or NULL=use first interface 
    * @return  mac address or empty string
    */
   @TargetApi(Build.VERSION_CODES.GINGERBREAD)
	public static String getMACAddress(String interfaceName) {
       try {
           List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
           for (NetworkInterface intf : interfaces) {
               if (interfaceName != null) {
                   if (!intf.getName().equalsIgnoreCase(interfaceName)) continue;
               }
               byte[] mac = intf.getHardwareAddress();
               if (mac==null) return "";
               StringBuilder buf = new StringBuilder();
               for (int idx=0; idx<mac.length; idx++)
                   buf.append(String.format("%02X:", mac[idx]));       
               if (buf.length()>0) buf.deleteCharAt(buf.length()-1);
               return buf.toString();
           }
       } catch (Exception ex) { } // for now eat exceptions
       return "";
       /*try {
           // this is so Linux hack
           return loadFileAsString("/sys/class/net/" +interfaceName + "/address").toUpperCase().trim();
       } catch (IOException ex) {
           return null;
       }*/
   }

   /**
    * Get IP address from first non-localhost interface
    * @param ipv4  true=return ipv4, false=return ipv6
    * @return  address or empty string
    */
   public static String getIPAddress(boolean useIPv4) {
       try {
           List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
           for (NetworkInterface intf : interfaces) {
               List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
               for (InetAddress addr : addrs) {
                   if (!addr.isLoopbackAddress()) {
                       String sAddr = addr.getHostAddress().toUpperCase();
                       boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); 
                       if (useIPv4) {
                           if (isIPv4) 
                               return sAddr;
                       } else {
                           if (!isIPv4) {
                               int delim = sAddr.indexOf('%'); // drop ip6 port suffix
                               return delim<0 ? sAddr : sAddr.substring(0, delim);
                           }
                       }
                   }
               }
           }
       } catch (Exception ex) { } // for now eat exceptions
       return "";
   }
}
